package com.rsy.common;

import java.util.concurrent.*;

public class ThreadTest {
    public static ExecutorService service = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("main.............start.......");
        /**
         * 1、继承Thread
         *
         * 2、实现Runnable
         *
         * 3、实现Callable接口+FutureTask(可以拿到返回结果，可以处理异常)
         *
         * 4、线程池
         *      给线程池直接提交任务
         *      service.execute(new Runnable01());
         *      创建
         *      1）、Executors
         *
         *总结：
         *  我们以后再业务代码里面，以上三种启动线程的方式都不用。将所有的多线程异步任务都交给线程池执行
         *
         * 区别：
         *  1、2不能得到返回值。3可以获取返回值
         *  1、2、3都不能控制资源
         *  4可以控制资源，性能稳定。
         */

        //当前系统中池只有一两个，每个异步任务，提交给线程池让他自己去执行就行


//        1、继承Thread
//        Thread01 thread01 = new Thread01();
//        thread01.start();//启动线程

//        2、实现Runnable
//        Runnable01 runnable01 = new Runnable01();
//        new Thread(runnable01).start();

//        3、实现Callable接口+FutureTask
        FutureTask<Integer> futureTask = new FutureTask<>(new Callable01());
        new Thread(futureTask).start();
        //阻塞等待整个线程执行完成，获取返回结果
        Integer integer = futureTask.get();

//        4、线程池
        service.execute(new Runnable01());

        System.out.println("main.............end......."+integer);
    }

    public static class Thread01 extends Thread{
        @Override
        public void run() {
            System.out.println("当前线程："+Thread.currentThread().getId());
            int i = 10/2;
            System.out.println("当前运行结果:" + i);
        }
    }

    public static class Runnable01 implements Runnable{

        @Override
        public void run() {
            System.out.println("当前线程："+Thread.currentThread().getId());
            int i = 10/2;
            System.out.println("当前运行结果:" + i);
        }
    }

    public static class Callable01 implements Callable<Integer> {

        @Override
        public Integer call() throws Exception {
            System.out.println("当前线程："+Thread.currentThread().getId());
            int i = 10/2;
            System.out.println("当前运行结果:" + i);
            return i;
        }
    }
}
